package com.woniu.zhoukao.controller;


import com.woniu.zhoukao.service.UserService;
import com.woniu.zhoukao.utils.CookieUtils;
import com.woniu.zhoukao.utils.JwtUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author woniumrwang
 * @since 2023-02-07 11:43:19
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RequestMapping("reg")
    @ResponseBody
    public String reg(String username,String password,String repass){

        try {
            userService.reg(username, password, repass);

            //注册用户是我们的主要目标
            //发送欢迎邮件之类的只是支线附加任务.
            //支线任务不应该阻塞我们主线任务的执行.

            //模拟发送邮件
            // sendEmail();  //这种直接调用的方式是同步操作,如果支线任务发生异常或者阻塞会导致我们主线任务的异常,从而导致用户体验非常不好

            //改造: 异步处理支线任务,不阻塞我们的主线任务
            //发布一个发送邮件的支线任务需求
            rabbitTemplate.convertAndSend("sendEmailExchange","sendEmail","xxx@qq.com");


        }catch (RuntimeException exception){
            exception.printStackTrace();  //打印异常栈
            return exception.getMessage();  //返回异常信息
        }

        return "ok";
    }


    private void sendEmail(){

        System.out.println("准备发送邮件");

        System.out.println("执行邮件的发送");
        try {
            //模拟邮件发送过程出现网络阻塞
            TimeUnit.SECONDS.sleep(30);  //当前线程暂停30s
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }


        System.out.println("邮件发送成功");
    }


    @RequestMapping("addCookie")
    @ResponseBody
    public String addCookie(String name, String value, HttpServletResponse response){

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        // domain + path  确定了cookie的生效范围
        //cookie.setDomain(""); //domain 域名   可以自己指定域名,也可以不写,不写的话默认就是当前网站的地址.
        cookie.setPath("/"); //在域名范围内的那些路径下是有效的   / 表示在当前网站下都有效
        cookie.setMaxAge(160);//设置cookie的有效期,单位秒
        cookie.setComment("测试cookie");

        response.addCookie(cookie);

        return "ok";
    }


    @RequestMapping("queryCookie")
    @ResponseBody
    public String queryCookie(HttpServletRequest request){

        Cookie[] cookies = request.getCookies();
        for(int i=0;cookies!=null && i<cookies.length;i++){
            System.out.println(cookies[i]);
        }

        return "ok";
    }



    @RequestMapping("updateCookie")
    @ResponseBody
    public String updateCookie(String name, String value, HttpServletResponse response){

        //更新cookie  重新写一遍

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        // domain + path  确定了cookie的生效范围
        //cookie.setDomain(""); //domain 域名   可以自己指定域名,也可以不写,不写的话默认就是当前网站的地址.
        cookie.setPath("/"); //在域名范围内的那些路径下是有效的   / 表示在当前网站下都有效
        cookie.setMaxAge(160);//设置cookie的有效期,单位秒   如果为0,就表示删除
        cookie.setComment("测试cookie");

        response.addCookie(cookie);

        return "ok";
    }



    @RequestMapping("delCookie")
    @ResponseBody
    public String delCookie(String name, String value, HttpServletResponse response){

        //删除cookie  cookie.setMaxAge(0)

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        // domain + path  确定了cookie的生效范围
        //cookie.setDomain(""); //domain 域名   可以自己指定域名,也可以不写,不写的话默认就是当前网站的地址.
        cookie.setPath("/"); //在域名范围内的那些路径下是有效的   / 表示在当前网站下都有效
        cookie.setMaxAge(0);//设置cookie的有效期,单位秒   如果为0,就表示删除
        cookie.setComment("测试cookie");

        response.addCookie(cookie);

        return "ok";
    }


    @RequestMapping("login")
    @ResponseBody
    public String login(String userName, String password,HttpServletResponse response){

        try {
            userService.loginCheck(userName, password);

            //将jwtToken作为cookie返回
            String token = JwtUtils.createToken(userName, 15);
            CookieUtils.setUserToken2Cookie(response, token);

            //向redis中存储关联数据,作为 当token过期时是否还续期的标记
            stringRedisTemplate.opsForValue().set(token,userName,30, TimeUnit.MINUTES);

        }catch (RuntimeException exception){
            exception.printStackTrace();
            return exception.getMessage();
        }

        return "ok";
    }


    @RequestMapping("currentUserName")
    @ResponseBody
    public String currentUserName(HttpServletRequest request){
        //从cookie中拿到userToken
        String userTokenFromCookie = CookieUtils.getUserTokenFromCookie(request);
        //然后从userToken中解析出用户名
        String accountFromToken = JwtUtils.getAccountWithoutException(userTokenFromCookie);
        return accountFromToken;
    }


    @RequestMapping("logout")
    @ResponseBody
    public String logout(HttpServletResponse response){
        CookieUtils.deleteUserTokenFromCookie(response);
        return "ok";
    }



}


